﻿#include "HookManager.h"
#include "Logger.h"
#include <detours.h>

std::vector<std::unique_ptr<IHookModule>> HookManager::modules;

void HookManager::RegisterModule(std::unique_ptr<IHookModule> module) {
    modules.push_back(std::move(module));
}

bool HookManager::InstallAll() {
    if (DetourTransactionBegin() != NO_ERROR) {
        g_Logger.Log("[Hook管理器] 无法开始事务");
        return false;
    }

    DetourUpdateThread(GetCurrentThread());

    for (auto& module : modules) {
        g_Logger.Log("[Hook管理器] 正在安装 %s", module->Name());
        if (!module->Install()) {
            g_Logger.Log("[Hook管理器] %s 安装失败", module->Name());
            DetourTransactionAbort();
            return false;
        }
    }

    if (DetourTransactionCommit() != NO_ERROR) {
        g_Logger.Log("[Hook管理器] 无法提交事务");
        return false;
    }

    return true;
}

bool HookManager::UninstallAll() {
    if (DetourTransactionBegin() != NO_ERROR) {
        g_Logger.Log("[Hook管理器] 无法开始卸载事务");
        return false;
    }

    DetourUpdateThread(GetCurrentThread());

    bool success = true;
    for (auto& module : modules) {
        g_Logger.Log("[Hook管理器] 正在卸载 %s", module->Name());
        if (!module->Uninstall()) {
            g_Logger.Log("[Hook管理器] %s 卸载失败", module->Name());
            success = false;
        }
    }

    if (DetourTransactionCommit() != NO_ERROR) {
        g_Logger.Log("[Hook管理器] 无法提交卸载事务");
        return false;
    }

    return success;
}
